package util

import (
	"time"
)

// TodayMinTime 今天的0点时间
func TodayMinTime() time.Time {
	now := time.Now()
	todayMin := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
	return todayMin
}

// TodayMaxTime 今天的最晚时间（最后1毫秒）
func TodayMaxTime() time.Time {
	now := time.Now()
	todayMax := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 999_000_000, now.Location())
	return todayMax
}

// WeekMinTime 当前周的最早时间
func WeekMinTime(firstDayOfMonday bool) time.Time {
	now := time.Now()
	weekday := now.Weekday() // 获取当前星期几（0=周日，1=周一，...，6=周六）

	daysToSunday := int(weekday) // 直接使用Weekday的int值（周日=0，正好是需要减去的天数）
	weekStartDate := now.AddDate(0, 0, -daysToSunday)

	if firstDayOfMonday {
		if weekday != time.Sunday {
			weekStartDate = weekStartDate.AddDate(0, 0, 1)
		} else {
			weekStartDate = weekStartDate.AddDate(0, 0, -6)
		}
	}

	// 构造本周日0点时间（一周起始）
	return time.Date(
		weekStartDate.Year(),
		weekStartDate.Month(),
		weekStartDate.Day(),
		0, 0, 0, 0,
		now.Location(),
	)
}

// WeekMaxTime 当前周的最晚时间（最后1毫秒）
func WeekMaxTime(firstDayOfMonday bool) time.Time {
	now := time.Now()
	weekday := now.Weekday() // 获取当前星期几（0=周日，1=周一，...，6=周六）

	// 计算距离本周六的天数差：周日差6天，周一差5天，...，周六差0天
	daysToSaturday := 6 - int(weekday)
	weekEndDate := now.AddDate(0, 0, daysToSaturday)

	if firstDayOfMonday {
		if weekday != time.Sunday {
			weekEndDate = weekEndDate.AddDate(0, 0, 1)
		} else {
			weekEndDate = weekEndDate.AddDate(0, 0, -6)
		}
	}

	// 构造本周六23:59:59.999时间（一周结束）
	return time.Date(
		weekEndDate.Year(),
		weekEndDate.Month(),
		weekEndDate.Day(),
		23, 59, 59, 999_000_000,
		now.Location(),
	)
}

// MonthMinTime 当月的最早时间（1日0点）
func MonthMinTime() time.Time {
	now := time.Now()
	// 构造当月1日0点时间（年、月取当前，日固定为1，时分秒纳秒为0）
	return time.Date(
		now.Year(),
		now.Month(),
		1,          // 当月第一天
		0, 0, 0, 0, // 00:00:00.000
		now.Location(), // 保持与当前时间一致的时区
	)
}

// MonthMaxTime 当月的最晚时间（最后一天23:59:59.999）
func MonthMaxTime() time.Time {
	now := time.Now()
	// 1. 获取下月1日的0点时间（若当前是12月，自动跨年）
	nextMonthFirstDay := time.Date(
		now.Year(),
		now.Month()+1, // 下月
		1, 0, 0, 0, 0,
		now.Location(),
	)
	// 2. 下月1日减1天 = 当月最后一天
	lastDayOfMonth := nextMonthFirstDay.AddDate(0, 0, -1)

	// 3. 构造当月最后一天的23:59:59.999时间
	return time.Date(
		lastDayOfMonth.Year(),
		lastDayOfMonth.Month(),
		lastDayOfMonth.Day(),
		23, 59, 59, 999_000_000, // 毫秒级精度（999毫秒）
		now.Location(),
	)
}
